package com.gitee.cashzhang27.test.boot.functional.properties;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.redisson.config.TransportMode;
import org.springframework.boot.context.properties.ConfigurationProperties;

/**
 * Redisson基础属性.
 *
 * @author Cash Zhang
 * @version v1.0 2020/09/17 10:46
 * @since v1.0
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
@ConfigurationProperties(prefix = "spring.redis.redisson")
public class RedissonProperties {

  /**
   * 线程池数量.
   * 默认值：16
   * Threads amount shared between all redis node clients.
   * 这个线程池数量被所有RTopic对象监听器，RRemoteService调用者和RExecutorService任务共同共享.
   */
  private int threads = 16;

  /**
   * Netty线程池数量.
   * 默认值：32
   * 这个线程池数量是在一个Redisson实例内，被其创建的所有分布式数据类型和服务，
   * 以及底层客户端所一同共享的线程池里保存的线程数量。
   */
  private int nettyThreads = 32;

  /**
   * 传输模式.
   * 默认值：TransportMode.NIO
   * 可选参数：
   * TransportMode.NIO,
   * TransportMode.EPOLL - 需要依赖里有netty-transport-native-epoll包（Linux）
   * TransportMode.KQUEUE - 需要依赖里有 netty-transport-native-kqueue包（macOS）
   */
  private TransportMode transportMode = TransportMode.NIO;

  /**
   * 监控锁的看门狗超时时间，单位：毫秒.
   * 默认值：30秒
   * 该参数只适用于分布式锁的加锁请求中未明确使用leaseTimeout参数的情况。
   * 如果该看门口未使用lockWatchdogTimeout去重新调整一个分布式锁的lockWatchdogTimeout超时，
   * 那么这个锁将变为失效状态。这个参数可以用来避免由Redisson客户端节点宕机或其他原因造成死锁的情况。
   */
  private long lockWatchdogTimeout = 30 * 1000;

  /**
   * 保持订阅发布顺序.
   * 默认值：true
   * 通过该参数来修改是否按订阅发布消息的接收顺序出来消息，
   * 如果选否将对消息实行并行处理，该参数只适用于订阅发布消息的情况。
   */
  private boolean keepPubSubOrder = true;

  /**
   * 清理过期条目最小延迟，单位：秒.
   * 默认值：5秒
   */
  private int minCleanUpDelay = 5;

  /**
   * 清理过期条目最大延迟，单位：秒.
   * 默认值：30分钟
   */
  private int maxCleanUpDelay = 30 * 60;

  /**
   * 删除过期条目过程中每个删除操作的 key 数量.
   */
  private int cleanUpKeysAmount = 100;

  /**
   * 集群模式.
   */
  private RedissonClusterServerProperties cluster = new RedissonClusterServerProperties();

  /**
   * 云托管模式.
   */
  private RedissonReplicatedServerProperties replicated = new RedissonReplicatedServerProperties();

  /**
   * 单Redis节点模式.
   */
  private RedissonSingleServerProperties single = new RedissonSingleServerProperties();

  /**
   * 哨兵模式.
   */
  private RedissonSentinelServerProperties sentinel = new RedissonSentinelServerProperties();

  /**
   * 主从模式.
   */
  private RedissonMasterSlaveServerProperties masterSlave =
      new RedissonMasterSlaveServerProperties();

}
